/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package csm.uttils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import csm.uttils.generics.Roster;


/**
 *
 * @author Carlos S. Moreno
 */
public class Operations {

     /**
     * Indica si un valor especifico se corresponde con el de un atributo del
     * objeto ingresado.
     * @param arg0 Objeto que posee el atributo
     * @param arg1 Valor a comparar con el atributo
     * @param field Nombre del atributo a comparar
     * @field nombre del atributo a corroborar
     * @return Verdadero si los valores se correponden - Falso si los valores son distintos
     */
    public static boolean isThisOne(Object arg0, Object arg1, String field) {

        Method meth;
                for(int i = 0; i < arg0.getClass().getDeclaredFields().length; i++)
                {
                    try{
                    meth = (arg0.getClass()).getMethod("get"+ Operations.capitalize(field));
                    if(arg1.toString().compareTo((meth.invoke(arg0)).toString())==0)return true;
                    }
                    catch (NoSuchMethodException e){System.out.print(e.toString());}
                    catch (NoSuchMethodError e){System.out.print(e.toString());}
                    catch (IllegalAccessException e){System.out.print(e.toString());}
                    catch (IllegalArgumentException e){System.out.print(e.toString());}
                    catch (InvocationTargetException e){System.out.print(e.toString());}
                }
        return false;
    }//Fin isThisOne

    /**
     * Convierte la primer letra de una cadena String a mayúscula
     * @param s Cadena a capitalizar
     * @return La cadena capitalizada
     */
    public static String capitalize(String s) {
        if (s.length() == 0) return s;
        return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
    }//Fin capitalize

    /**
     * Indica si la cadena ingresada por parámetro es un valor numérico
     * @param str Cadena a corroborar
     * @return Verdadero si es un valor numérico - Falso si no lo es
     */
    public static boolean isNumeric(String str)
    {
        try{Double.parseDouble(str);}
        catch (NumberFormatException e) {return false;}
        return true;
    }//Fin isNumeric

   
    /**
     * Genera un código aleatoreo de longitud variable de solo numeros
     * @param longitude Longitud del código solicitado, en cantidad de caracteres
     * @return Entero de longitud igual al valor ingresado por parámetro.
     */
    public static int generateCode(int longitude)
    {
       return Integer.parseInt(generateCode(longitude, false));
    }//Fin generateCod
    
    /**
     * Genera un código aleatoreo de longitud variable, que puede ser solo
     * de números, o de números y letras
     * @param longitude Longitud del código solicitado, en cantidad de caracteres
     * @param mixed Indica si el codigo debera ser de números o de letras y números
     * @return Cadena de caracteres de longitud igual al valor ingresado por parámetro.
     */
    public static String generateCode(int longitude, boolean mixed)
    {
        String cod = "";
        for(int i = 1; i <= longitude; i++)
        {
            if (mixed && i%2==0)
                cod += generateUpperLetter();
            else
                cod += generateNumber();
        }
        return cod;
    }//Fin generateCod

    private static int generateNumber()
    {
        return (int)(Math.random()*10);
    }

     private static char generateUpperLetter()
    {
        return (char)((int)(Math.random()*25)+65);
    }

     /**
      * Devuelve el siguiente numero primo al valor ingresado
      * por parametros
      * @param n Numero inicial desde el que se busca el siguiente primo
      * @return El siguiente numero primo despues de n
      */
     public static final int nextPrime ( int  n )
     {
	if ( n % 2  == 0)   n++;
	for ( ; isPrime(n); n+=2 );
	return n;
     }//Fin nextPrime

     /**
      * Indica si el numero ingresado por parámetros es primo o no
      * @param n Numero a analizar
      * @return True si es Primo, Flase, si no lo es
      */
     public static final boolean isPrime(int n)
     {
         int cont = 2;
         boolean result=true;
         while ((result) && (cont != n))
         {
             if (n % cont == 0)
                 result = false;
             ++cont;
         }
         return result;
     }//Fin isPrime

    
}//Fin Operations
